package visitor;
import operator.Cat;
import operator.Minus;
import operator.Operator;
import operator.Plus;
import operator.Produs;
import arbori.Nod;
import functii.Functie;
import functiiElementare.Constanta;
import functiiElementare.Necunoscuta;
import functiiTrigonometrice.Cos;
import functiiTrigonometrice.Sin;

public class ToStringVisitor extends Visitor {
        private String s;
        
        public ToStringVisitor()//constructor implicit
        {
                this.s="";
        }
        public ToStringVisitor(String s)//constructor explicit
        {
                this.s=s;
        }
        
        public String getS()
        {
                return this.s;
        }
        public void setS(String s)
        {
                this.s=s;
        }
        
        
        public void visitare(Operator o) {
        if(o.getfStang()!=null&&o.getfDrept()!=null)
        {
        visit(o.getfStang());
        String s1=this.s;
        visit (o.getfDrept());
         String s2=this.s;
         s=o.concatTermeni (s1,s2);
        }
        }       
        
        public void visit(Plus p)
        {
                visitare(p);
        }
        
        public void visit(Minus m)
        {
                visitare(m);
        }
        public void visit(Cat c)
        {
                visitare(c);
        }
        public void visit(Produs p)
        {
                visitare(p);
        }
        public void visit(Necunoscuta n)
        {
                this.s="x";
        }
        public void visit(Constanta c)
        {
                this.s=Double.toString(c.getCt());
        }       
        public void visit(Operator p)
        {
                if((p.getfStang()!=null)&&(p.getfDrept()!=null))
                {
                        visit(p.getfStang());
                        String s1=this.s;
                        visit(p.getfDrept());
                        String s2=this.s;
                        s=p.concatTermeni(s1,s2);
                }
        }
        public void visit(Functie f)
        {
                if(f.getfStang()!=null)
                {
                        visit(f.getfStang());
                        String s1=this.s;
                        s=f.concatTermeni(s1);
                        
                }
        }
        public void visit(Sin s)
        {}
        public void visit(Cos c)
        {}
        public void visit(Nod n)
        {
                if(n instanceof Operator)
                {
                        visit((Operator)n);
                }
                else
                 {
                  if(n instanceof Necunoscuta)
                        {
                          visit((Necunoscuta)n);
                         }
                        else
                                {
                                 if(n instanceof Constanta)
                                   {
                                         visit((Constanta)n);
                                    }
                                 }
                        }
        if(n instanceof Functie)
        {
                visit((Functie)n);
        }
        if(n instanceof Sin)
        {
                visit((Functie)n);
        }
        }
}